package com.city.java.orders.mapper;

import com.city.java.orders.pojo.entity.Orders;
import org.apache.ibatis.annotations.Param;
import java.time.LocalDateTime;
import java.util.List;

public interface OrderMapper {
    /**
     * 插入新订单
     * @param order 订单对象
     * @return 影响行数
     */
    int insertOrder(Orders order);

    /**
     * 根据订单ID查询订单
     * @param orderId 订单ID
     * @return 订单对象
     */
    Orders selectById(@Param("orderId") Long orderId);

    /**
     * 查询所有订单列表
     * @return 订单列表
     */
    List<Orders> selectAll();

    /**
     * 根据用户ID查询订单列表
     * @param userId 用户ID
     * @return 订单列表
     */
    List<Orders> selectByUserId(@Param("userId") Long userId);

    /**
     * 根据商品ID查询订单列表
     * @param productId 商品ID
     * @return 订单列表
     */
    List<Orders> selectByProductId(@Param("productId") Long productId);

    /**
     * 根据商品名称查询订单列表
     * @param productName 商品名称
     * @return 订单列表
     */
    List<Orders> selectByProductName(@Param("productName") String productName);

    /**
     * 根据订单创建时间范围查询订单列表
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 订单列表
     */
    List<Orders> selectByDateRange(@Param("startTime") LocalDateTime startTime,
                                   @Param("endTime") LocalDateTime endTime);

    /**
     * 根据商品名称和时间范围查询订单列表
     * @param productName 商品名称
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 订单列表
     */
    List<Orders> selectByConditions(@Param("productName") String productName,
                                    @Param("startTime") LocalDateTime startTime,
                                    @Param("endTime") LocalDateTime endTime,
                                    @Param("pageNum") Integer pageNum,
                                    @Param("pageSize") Integer pageSize);

    /**
     * 根据订单ID更新订单信息
     * @param order 订单对象
     * @return 影响行数
     */
    int updateById(Orders order);

    /**
     * 根据订单ID删除订单
     * @param orderId 订单ID
     * @return 影响行数
     */
    int deleteById(@Param("orderId") Long orderId);

    Long getTotal(@Param("productName") String productName,
                  @Param("startTime") LocalDateTime startTime,
                  @Param("endTime") LocalDateTime endTime);
}
